/**
 * 将 PCM 数据的 Blob 对象转换为 Base64 字符串。
 * @param {Blob} pcmBlob 包含 PCM 数据的 Blob 对象。
 * @returns {Promise<string>} 返回一个 Promise，解析时包含 Base64 字符串，拒绝时包含错误信息。
 */
export function pcmBlobToBase64(pcmBlob) {
	return new Promise((resolve, reject) => {
		const fileReader = new FileReader()

		fileReader.onload = function () {
			const pcmDataArrayBuffer = fileReader.result
			const pcmArray = new Uint8Array(pcmDataArrayBuffer)

			const base64String = encodePCMToBase64(pcmArray)
			resolve(base64String)
		}

		fileReader.onerror = function (error) {
			reject(error)
		}

		// 读取 Blob 数据
		fileReader.readAsArrayBuffer(pcmBlob)
	})
}

/**
 * 将 PCM 数据编码为 Base64 字符串。
 * @param {Uint8Array} pcmArray 包含 PCM 数据的 Uint8Array。
 * @returns {string} 返回编码后的 Base64 字符串。
 */
function encodePCMToBase64(pcmArray) {
	const base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
	const base64Array = new Uint8Array(Math.ceil(pcmArray.length / 3) * 4)

	let enc1, enc2, enc3, enc4
	let i = 0
	let j = 0

	while (i < pcmArray.length) {
		enc1 = pcmArray[i++]
		enc2 = i < pcmArray.length ? pcmArray[i++] : 0
		enc3 = i < pcmArray.length ? pcmArray[i++] : 0

		const combined = (enc1 << 16) + (enc2 << 8) + enc3

		base64Array[j++] = base64chars.charCodeAt((combined >> 18) & 63)
		base64Array[j++] = base64chars.charCodeAt((combined >> 12) & 63)
		base64Array[j++] = i < pcmArray.length + 2 ? base64chars.charCodeAt((combined >> 6) & 63) : 61
		base64Array[j++] = i < pcmArray.length + 1 ? base64chars.charCodeAt(combined & 63) : 61
	}

	return String.fromCharCode.apply(null, base64Array)
}
